"""
和鼠标事件相关的模块
"""
import pygame
from image import Image
from typing import Dict, Callable

# 需要监听鼠标是否移入的对象及其处理函数组成的字典
obj_listen_mouse_motion_dict: Dict[Image, Callable] = dict()


def get_obj_listen_mouse_motion_dict():
    """
    获取需要监听鼠标是否移入的对象及其处理函数组成的字典
    :return: 需要监听鼠标是否移入的对象及其处理函数组成的字典
    """
    return obj_listen_mouse_motion_dict


def mouse_motion_handler(event: pygame.event.Event):
    """
    鼠标移动事件处理函数
    :param event: 事件对象
    :return:
    """
    # 如果当前事件不为鼠标移动事件
    if event.type != pygame.MOUSEMOTION:
        return
    # 循环遍历字典
    for obj in obj_listen_mouse_motion_dict.keys():
        # 鼠标是否在当前遍历到的对象上
        is_mouse_motion = obj.rect.collidepoint(event.pos)
        # 获取与当前遍历对象相对应的鼠标移入事件处理函数，并调用
        handler = obj_listen_mouse_motion_dict[obj]
        handler(is_mouse_motion, event)


# 需要监听鼠标点击的对象及其处理函数组成的字典
obj_listen_mouse_down_dict: Dict[Image, Callable] = dict()


def get_obj_listen_mouse_down_dict():
    """
    获取需要监听鼠标点击的对象及其处理函数组成的字典
    :return: 需要监听鼠标点击的对象及其处理函数组成的字典
    """
    return obj_listen_mouse_down_dict


def mouse_down_handler(event: pygame.event.Event):
    """
    鼠标点击事件处理函数
    :param event: 事件对象
    :return:
    """
    # 如果当前的事件不为鼠标点击事件
    if event.type != pygame.MOUSEBUTTONDOWN:
        return
    # 循环遍历字典
    for obj in obj_listen_mouse_down_dict.keys():
        # 如果当前遍历的对象没被点击
        if not obj.rect.collidepoint(event.pos):
            continue
        # 获取与当前遍历对象相对应的鼠标点击事件处理函数，并调用
        handler = obj_listen_mouse_down_dict[obj]
        handler(event)
